import API from "@/api/index.js"

/**
 * 获取当前位置的经纬度
 */
function getLonLat() {
	return new Promise((resolve) => {
		uni.showLoading()
		uni.getLocation({
			type: "wgs84", // 大地坐标系
			success(res84) {
				uni.getLocation({
					type: "gcj02", // 高德坐标系
					success(res02) {
						uni.hideLoading()
						resolve({
							wgs84: {
								longitude: String(getFixed6(res84.longitude)),
								latitude: String(getFixed6(res84.latitude))
							},
							gcj02: {
								longitude: String(getFixed6(res02.longitude)),
								latitude: String(getFixed6(res02.latitude))
							}
						})
						resolve(wgs84)
					},
					fail(err) {
						uni.hideLoading()
						resolve(null)
					}
				})
			},
			fail(err) {
				uni.hideLoading()
				resolve(null)
			}
		})
	})
}

/**
 * 计算两个经纬度之间的距离
 * 
 * @param {Object} lat1
 * @param {Object} lon1
 * @param {Object} lat2
 * @param {Object} lon2
 */
function calcDistance(lat1, lon1, lat2, lon2) {
	const R = 6371e3; // 地球半径，单位为米
	const φ1 = lat1 * Math.PI / 180; // 将纬度转换为弧度
	const φ2 = lat2 * Math.PI / 180; // 将纬度转换为弧度
	const Δφ = (lat2 - lat1) * Math.PI / 180; // 将纬度差转换为弧度
	const Δλ = (lon2 - lon1) * Math.PI / 180; // 将经度差转换为弧度
	const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
		Math.cos(φ1) * Math.cos(φ2) *
		Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
	const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
	const distance = R * c; // 计算距离
	return distance
}

/**
 * 计算两个距离点是否小于 200m
 * @param {Object} lat1
 * @param {Object} lon1
 * @param {Object} lat2
 * @param {Object} lon2
 */
function isLT200m(lat1, lon1, lat2, lon2) {
	return calcDistance(lat1, lon1, lat2, lon2) < 200
}

/**
 * 获取当前位置省市县
 */
function getAddress() {
	return new Promise((resolve) => {
		getLonLat().then(res => {
			if (!res) {
				resolve(false)
			}
			const longitude = res.gcj02.longitude
			const latitude = res.gcj02.latitude
			API.CjRecordApi.getAddress({
				longitude,
				latitude
			}).then(res => {
				if(res.code !== 200 || !res.data) {
					resolve(false)
				}
				resolve(res.data)
			}).catch(err => resolve(false))
		})
	})
}

// 传入数字或者字符串截取后六位
function getFixed6(num) {
	const strNum = num.toString();
	const decimalPointIndex = strNum.indexOf('.');
	if (decimalPointIndex === -1) {
		return num;
	} else {
		const decimalPart = strNum.slice(decimalPointIndex + 1);
		const decimalLength = decimalPart.length;
		if (decimalLength <= 6) {
			return Number(strNum);
		} else {
			return Number(num.toFixed(6));
		}
	}
}

const UniUtil = {
	getLonLat,
	calcDistance,
	isLT200m,
	getAddress,
	getFixed6
}

export default UniUtil